﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

using System.Collections;
using System.IO;

using SistemaCenterQuimPost.Control; //Usado para validar textBox
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,
using SistemaCenterQuimPost.Entidad; //necesario para crear clases de Prodcutos y resguardar los mismos


namespace SistemaCenterQuimPost.UI.PostAdministrador
{
    public partial class frmMovimientosProducto : SistemaCenterQuimPost.UI.frmGestionProductos
    {
        //------------------ATRIBUTOS--------------
        DataSet2TableAdapters.TrasladosTableAdapter trasladoTa;
      

        //---------------CONSTRUCTORES-------------
        public frmMovimientosProducto()
        {
            InitializeComponent();

            centerQuimDs = new DataSet2();  //se inicializan los atributos que me permiten conectarme a una base de datos.
            productosTa = new DataSet2TableAdapters.ProductosTableAdapter();
            movimientosTa = new DataSet2TableAdapters.MovimientosxProductoTableAdapter();
            trasladoTa = new DataSet2TableAdapters.TrasladosTableAdapter();

            removerControles(); //quita los controles inecesarios.

            posicionarListBox(); //se posiciona los listBox, porque por herencia en el diseño no se puede.
        }


        //----------------ESTADOS------------------

        private void frmMovimientosProducto_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;  //necesario para trabajar con hilos.

            this.limpiarDatos(); //deja la preparada para nuevos datos.
            
            estEsperandoOperacion(); //estado al comenzar el formulario.
            cargarNombrePost();
            
            cboTipoMov.SelectedIndex = 0;
        }


        //---------------METODOS VARIOS------------
        
        private void removerControles()   //Eliminar los controles que heredé pero que no los voy a usar.
        {
            this.Controls.Remove(this.lblPrecioCosto);
            this.Controls.Remove(this.txtPrecioCosto);
            this.Controls.Remove(this.lblPrecioVenta);
            this.Controls.Remove(this.txtPrecioVenta);
            this.Controls.Remove(this.lblStockActual);
            this.Controls.Remove(this.txtStockActual);
            this.Controls.Remove(this.lblCantMinima);
            this.Controls.Remove(this.txtCantMinima);
            this.Controls.Remove(this.btnAgregar);
            this.Controls.Remove(this.btnEditar);
            this.Controls.Remove(this.lblEditar);
            this.Controls.Remove(this.lblAgregar);
            this.Controls.Remove(this.btnProcesar);


            this.Controls.Remove(this.lblErrorPCosto);
            this.Controls.Remove(this.lblErrorPVenta);
            this.Controls.Remove(this.lblErrorStockActual);
            this.Controls.Remove(this.lblErrorCantMin);
        }


        private void posicionarListBox() //deja a los lstProductos en un lugar adecuado.
        {
            lstProductosCodBarra.Location = new Point(133, 62);
            lstProductosDescripcion.Location = new Point(471, 62);
        }

        
        private void limpiarDatos() //limpia todos los datos de la interfaz menos el encabezados de los prodcutos (cod, Descripcion)
        {
            this.dtpFechaDesde.Text = "";
            this.dtpFechaHasta.Text = "";
            this.lblPrecioCosto.Text = "--/--/----";
           

        }
        
        private void limpiarGrilla()
        {
            dgvMovimientos.Rows.Clear();
        }

        //Redefinido del padre
        protected override void actualizarResgProductos() //Se refresca el arrayList resgProductos
        {
            try
            {
                //(ALE) HACER EL FILL O COMO LO LLAMES ACA ABAJO
                //ProductosTa.FillByProductos1(centerQuimDs,...);
                productosTa.FillByNoGranel(centerQuimDs.Productos);

                resgProductos.Clear(); //Se vacia resgProductos (ArrayList)

                foreach (DataRow unaFila in centerQuimDs.Productos) //Se recorre todas las filas  del centerQuimDs.Productos y se cargan los productos al ArrayList
                {
                    resgProductos.Add(new Producto(Convert.ToString(unaFila[0]), Convert.ToString(unaFila[1])));
                }

                refrescarResgProductos = false;

            }
            catch (IndexOutOfRangeException)
            {
                //si llega a ocurrir esta excepcion no se tiene en cuenta. Podría no haber productos cargados y lanzaría esta excepción.

            }
            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //Si llega a ocurrir algún error grave se cierra el formulario 
                this.Close();
            }

        }

        //se redefine desde el padre
        protected override void cargarProductoPorCodigo(string unCodBarra) //busca producto con codigo de barra único (una coincidencia) encontrado en el oHiloFiltrarCodBarra y lo carga en el dgvProductos
        {
            try
            {
                //(ALE)HACER EL FILL O COMO LO LLAMES ACA ABAJO
                //ProductosTa.FillByProductos1(centerQuimDs,unCodBarra);
                productosTa.FillByCodigo(centerQuimDs.Productos, unCodBarra);

                txtCodBarra.Text = centerQuimDs.Productos[0].codProducto; //deja el encabezado para que pueda buscar los movimientos
                txtDescripcion.Text = centerQuimDs.Productos[0].descripcion;


            }
            catch (IndexOutOfRangeException)
            {

            }
            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //Si llega a ocurrir algún error grave se cierra el formulario 
                this.Close();
            }
        }

        protected override void cargarProductoPorDescripcion(string unaDescripcion)  //busca el producto por descripción en la base de datos y lo carga en el dgvProductos.
        {
            //(ALE) HACER EL FILL O COMO LO LLAMES ACA ABAJO
            productosTa.FillByNombre(centerQuimDs.Productos, unaDescripcion);


            txtCodBarra.Text = centerQuimDs.Productos[0].codProducto; //deja el encabezado para que pueda buscar los movimientos
            txtDescripcion.Text = centerQuimDs.Productos[0].descripcion;


        }

        //Redefinido del Padre
        protected override void resguardarProductoActual() //esta operación aunque se hereda, se deja vacia.
        {

        }

        //Redefinido del padre
        protected override void procesar() //esta operación no se usa.
        {
            
        }

        private int obtenerCodUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getCodUsuario();
        }


        private string obtenerNombreUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getNombreUsuario();
        }


        private string obtenerFechaActual()  //Dato necesario para la apertura de una caja.
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private void btnBusVentas_Click(object sender, EventArgs e)
        {
            buscarMovimientos();
            
        }

        private void buscarMovimientos()
        {
            try
            {
                filtrar();
                limpiarGrilla();
                centerQuimDs.MovimientosxProducto.AcceptChanges();
                if (centerQuimDs.MovimientosxProducto.Rows.Count > 0)
                {
                    cargarGrilla();
                }
                else
                {
                    MessageBox.Show("No existen movimientos del producto.", "MOVIMIENTOS DEL PRODUCTO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

               
            }

            /*catch (IndexOutOfRangeException)
            {
                MessageBox.Show("Para ver movimientos debe seleccionar un producto.", "MOVIMIENTOS DEL PRODUCTO", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }*/

            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        private void filtrar() //llevamos a cabo distintas busquedas segun los datos que nos da el formulario
        {

            if (txtDescripcion.Text == "") //SI NO TENEMOS DESCRIPCION
            {
                movimientosTa.FillByEntreFechas(centerQuimDs.MovimientosxProducto, DateTime.Parse(dtpFechaDesde.Value.ToShortDateString()), dtpFechaHasta.Value);
                if (centerQuimDs.MovimientosxProducto.Rows.Count > 0)
                {
                    filtrosPorCombo();
                }
                else
                {
                    MessageBox.Show("No existen movimientos del producto.", "MOVIMIENTOS DEL PRODUCTO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                movimientosTa.FillByEntreFechasyDescripcion(centerQuimDs.MovimientosxProducto, DateTime.Parse(dtpFechaDesde.Value.ToShortDateString()), dtpFechaHasta.Value, txtDescripcion.Text);
                if (centerQuimDs.MovimientosxProducto.Rows.Count > 0)
                {
                    filtrosPorCombo();
                }
                else
                {
                    if (centerQuimDs.MovimientosxProducto.Rows.Count > 0)
                    {
                        MessageBox.Show("No existen movimientos del producto.", "MOVIMIENTOS DEL PRODUCTO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }

            } 
              
   
        }

        private void filtrosPorCombo() //realiza diferentes tipos de filtrs segun lo que el usuario ingresa en los comboBox
        {
            if (cboTipoMov.SelectedIndex != 0) //SI SE INDICA EL TIPO DE MOVIMIENTO
            {
                for (int i = 0; i < centerQuimDs.MovimientosxProducto.Rows.Count; i++)
                {
                    if (!(Regex.Match(centerQuimDs.MovimientosxProducto[i].concepto,  cboTipoMov.SelectedItem.ToString()).Success))
                    {
                        centerQuimDs.MovimientosxProducto[i].Delete();
                    }

                }

                centerQuimDs.MovimientosxProducto.AcceptChanges();
            }

            if (cboPost.SelectedIndex != 0)
            {
                if (cboTipoMov .SelectedIndex == 3) //si es un traslado y se selecciona el post
                {
                    for (int i = 0; i < centerQuimDs.MovimientosxProducto.Rows.Count; i++)
                    {
                        int longitud = centerQuimDs.MovimientosxProducto[i].concepto.ToString().Length - 19;
                        string numerocodigo = centerQuimDs.MovimientosxProducto[i].concepto.ToString().Substring(19, longitud);
                        trasladoTa.FillByCodigoTraslado(centerQuimDs.Traslados, Convert.ToInt32(numerocodigo ));
                        if (centerQuimDs.Traslados[0].post != cboPost.SelectedItem.ToString())
                        {
                            centerQuimDs.MovimientosxProducto[i].Delete();
                        }
                    }

                }

                if (cboTipoMov.SelectedIndex == 4) //si es un traslado y se selecciona el post
                {
                    for (int i = 0; i < centerQuimDs.MovimientosxProducto.Rows.Count; i++)
                    {
                        int longitud = centerQuimDs.MovimientosxProducto[i].concepto.ToString().Length - 18;
                        string numerocodigo = centerQuimDs.MovimientosxProducto[i].concepto.ToString().Substring(18, longitud);
                        trasladoTa.FillByCodigoTraslado(centerQuimDs.Traslados, Convert.ToInt32(numerocodigo ));
                        if (centerQuimDs.Traslados[0].post != cboPost.SelectedItem.ToString())
                        {
                            centerQuimDs.MovimientosxProducto[i].Delete();
                        }
                    }

                }
            }
        }
            
            private void cargarGrilla()
        {
            for (int i = 0; i < centerQuimDs.MovimientosxProducto.Rows.Count; i++)
            {
                dgvMovimientos.Rows.Add(centerQuimDs.MovimientosxProducto[i].fechaMovimiento, centerQuimDs.MovimientosxProducto [i].descripcion  , centerQuimDs.MovimientosxProducto[i].concepto, centerQuimDs.MovimientosxProducto[i].Cantidad);
            }
        }

        

        private void dtpFechaDesde_KeyDown(object sender, KeyEventArgs e)  //captura cuando se presiona enter sobre los dataTimeSpeaker. 
        {
            if (e.KeyCode == Keys.Enter)
            {
                buscarMovimientos();

            }
        }

        private void cboTipoMov_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboTipoMov .SelectedIndex == 3)
            {
                lblPost.Text = "Post Origen";
                cboPost.Enabled = true;
            }
            else if (cboTipoMov.SelectedIndex == 4)
            {
                lblPost.Text = "Post Destino";
                cboPost.Enabled = true;
            }
            else
            {
                lblPost.Text = "Post";
                cboPost.Enabled = false;
                cboPost.SelectedIndex = 0;
            }
        }

        private ArrayList obtenerNombresPost() //obtiene los nombres de los post.
        {
            string[] listaSubcarpetas; //variable que almacenará la lista de todas las subcarpetas dentro de Dropbox.
            listaSubcarpetas = Directory.GetDirectories("C:\\Dropbox"); //obtenemos la lista de las subcarpetas en Dropbox.

            ArrayList nombresPost = new ArrayList(); //creamos un arrayList, que almacenará solo los nombre de los post
            nombresPost.Clear(); //vaciamos el arrayList

            foreach (string unaSubcarpeta in listaSubcarpetas)
            {
                FileInfo unFileInfo = new FileInfo(unaSubcarpeta); //creamos un FileInfo que almacen
                if (Regex.Match(unFileInfo.Name, "POST*").Success)
                {
                    nombresPost.Add(unFileInfo.Name);
                }
            }

            return (nombresPost);

        }

        private void cargarNombrePost() //carga los nombres de los post en cboPost.
        {
            cboPost.Items.Clear(); //se vacia el cbo de post
            cboPost.Items.Add(""); //se carga el primer valor vacio.

            ArrayList listaPost = new ArrayList(); //almacenara los nombres (string) de todos los post, para luego buscar sus nombres de pedidos.

            listaPost = obtenerNombresPost(); //se obtienen todos los nombre de post.

            foreach (string nombrePost in listaPost) //se cargan los nombres de los post en los combos correspondientes
            {
                cboPost.Items.Add(nombrePost);

            }

            cboPost.SelectedIndex = 0; //colocamos el primer items en el comboBox.

        }
        
    }
}
